直方圖反向投影是一種利用顏色分布找出特定區域的技術。
常用於目標檢測與追蹤,例如:從一張大圖中找出某個物體,或鎖定影片中出現的特定顏色範圍。此方法能根據顏色特徵快速定位目標。
請準備兩張圖片:
import cv2
# 讀取 ROI(目標區域)與大圖
roi = cv2.imread('roi.jpg')
target = cv2.imread('target.jpg')
cv2.imshow('ROI', roi)
cv2.imshow('Target', target)
# 將以下程式碼放在所有顯示語句的最後面
cv2.waitKey()
cv2.destroyAllWindows()
這裡使用的原圖ROI如下
這裡使用的原圖target如下
# 轉換成 HSV 色彩空間
hsv_roi = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)
hsv_target = cv2.cvtColor(target, cv2.COLOR_BGR2HSV)
# 計算 ROI 的 HSV 直方圖(只針對 H 與 S 通道,忽略亮度)
roi_hist = cv2.calcHist([hsv_roi], [0, 1], None, [180, 256], [0, 180, 0, 256])
# 正規化到 0~255,提升匹配穩定性
roi_hist = cv2.normalize(roi_hist, roi_hist, 0, 255, cv2.NORM_MINMAX)
# 使用直方圖反向投影,找出 ROI 在 target 中的可能區域
dst = cv2.calcBackProject([hsv_target], [0, 1], roi_hist, [0, 180, 0, 256], 1)
# 應用濾波與閾值化,讓結果更清晰
disc = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5,5))
dst = cv2.filter2D(dst, -1, disc)
# 二值化
_, thresh = cv2.threshold(dst, 50, 255, cv2.THRESH_BINARY)
# 將二值化結果與原圖結合,僅保留匹配區域
res = cv2.bitwise_and(target, target, mask=thresh)
cv2.imshow('BackProjection', res)
方法 | 說明 |
---|---|
calcHist + equalizeHist | 分析並改善亮度或對比度,適合整體影像增強 |
calcBackProject | 根據顏色直方圖找出相似區域,適合目標追蹤與定位 |
比較:calcHist + equalizeHist 著重於影像整體亮度與對比度改善,calcBackProject 則專注於顏色分布的目標搜尋,適合用於物件追蹤與檢索。
直方圖反向投影是影像檢索與追蹤的基礎方法,特別適合用於顏色主導的物體偵測與定位。
雖然對光線變化較敏感,但搭配濾波、閾值化及其他方法,能成為強大的影像搜尋工具,廣泛應用於監控、目標追蹤、互動系統等場景。